package com.java.runnable.test1;

/**
 * @author luzhikun
 * @date &{DATE}-18:13
 * <p>
 * <p>
 * 创建多线程的方式二：实现Ruannable接口
 * 1.创建一个实现了Ruannable接口的类
 * 2.实现类去重写Ruannable中的抽象方法：run（）
 * 3.创建实现类的对象
 * 4.将此对象作为参数传递到Thread类的构造器中，创建Thread类的对象
 * 5.通过Thread类的对象去调用start（）方法
 */
/**
 *
 * 创建多线程的方式二：实现Ruannable接口
 *      1.创建一个实现了Ruannable接口的类
 *      2.实现类去重写Ruannable中的抽象方法：run（）
 *      3.创建实现类的对象
 *      4.将此对象作为参数传递到Thread类的构造器中，创建Thread类的对象
 *      5.通过Thread类的对象去调用start（）方法
 * */

/**
 *
 * 通过实现Runnable接口的方式，实现三个窗口买票
 * 存在线程安全问题，待解决
 *
 *
 * 比较创建两种线程的方式：
 *      开发中，优先选择实现Runnable接口的方式
 *      原因 1：实现的方式没有类的单继承性的局限性
 *          2：实现的方式更适合处理多个线程有共享数据的情况
 *   联系： public class Thread implements Runnable   其实Thread类也实现了Runnable接口中的run（）方法
 *   相同点：不管继承的方式还是实现的方式都需要重写run（）方法，将线程要执行的逻辑声明在run（）方法中
 *
 * */
public class RunnableTest {
    public static void main(String[] args) {
        Runable runable = new Runable();

        Thread thread = new Thread(runable);
        thread.setName("窗口一");
        thread.start();

        Thread thread1 = new Thread(runable);
        thread1.setName("窗口二");
        thread1.start();

        Thread thread2 = new Thread(runable);
        thread2.setName("窗口三");
        thread2.start();
    }
}

class Runable implements Runnable {


    private int ticket = 100;

    @Override
    public void run() {
        while (true) {
            if (ticket > 0) {
                System.out.println(Thread.currentThread().getName() + "恭喜你买到票了，票号为 " + ticket);
                ticket--;
            } else {
                System.out.println("对不起，没有票了");
                break;
            }
        }
    }
}
